#include <bits/stdc++.h>
using namespace std;

// #define ONLINE_JUDGE

#ifndef ONLINE_JUDGE
#define dbg(x...) { cerr << "\033[32;1m" << #x << " -> "; err(x); }
void err() { cerr << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cerr << a << ' '; err(x...); }
#else
#define dbg(...)
#endif

typedef long long LL;

// int n;

// const int N = 100;

// int go(int a[], int n)
// {
// 	int ans = 0;
// 	for (int l=0; l<n; ++l)
// 	for (int r=l; r<n; ++r)
// 	{
// 		int maxv = a[l], minv = a[l];
// 		for (int i=l; i<=r;++i)
// 		{
// 			maxv = max(maxv, a[i]);
// 			minv = min(minv, a[i]);
// 		}
// 		if (maxv - minv == r - l)
// 		{
// 			++ans;
// 		}
// 	}
// 	return ans;
// }

// int fac(int n)
// {
// 	int ans = 1;
// 	for (int i=1; i<=n; ++i)
// 		ans *= i;
// 	return ans;
// }

// int solve(int n)
// {
// 	static int a[N];
// 	for (int i=0; i<n; ++i)
// 	{
// 		a[i] = i;
// 	}
// 	int ans = 0;
// 	do
// 	{
// 		ans += go(a, n);
// 	} while (next_permutation(a, a+n));
// 	return ans;
// }

// int main(int argc, char const *argv[])
// {
// 	for (int i=1; i<=8; ++i)
// 	{
// 		int ans = 0;
// 		for (int j=1; j<=i; ++j)
// 		{
// 			ans += (i+1-j) * fac(j) * fac(i+1-j);
// 		}
// 		dbg(ans, solve(i));
// 	}
// 	return 0;
// }

const int N = 3e5+5;

LL inv[N << 1];
void invInit(int n, const LL p)
{
	inv[1] = 1;
	for (int i=2; i<n; ++i)
		inv[i] = (p - p / i) * inv[p % i] % p;
}

LL bin(LL a, LL b, const LL p)
{
	LL res = 1;
	for (; b; b>>=1, a=a*a%p)
		if (b & 1) res = res * a % p;
	return res;
}

LL f[N], g[N], h[N];

int n, m;

int main(int argc, char const *argv[])
{
	cin >> n >> m;
	f[0] = 1;
	const int p = m;
	for (int i=1; i<=n; ++i)
		f[i] = f[i-1] * i % p;
	for (int i=1; i<=n; ++i)
	{
		g[i] = f[i] * f[n+1-i] % p;
		h[i] = (h[i-1] + g[i]) % p;
		// h[i] = ();
	}
	LL ans = 0;
	for (int i=1; i<=n; ++i) ans = (ans + h[i]) % p;
	printf("%lld\n", ans % p);

	return 0;
}

